home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / Graphics / Gnuplot / Source / GeneralPane.m < prev    next >
Encoding:
Text File  |  1993-03-18  |  9.5 KB  |  428 lines

  1.  
  2. static char RCSId[]="$Id: GeneralPane.m,v 1.1.1.1 1993/03/18 03:33:19 davis Exp $";
  3.  
  4.  
  5. #import <appkit/Application.h>
  6. #import <appkit/Box.h>
  7. #import <appkit/Button.h>
  8. #import <appkit/Matrix.h>
  9. #import <appkit/Panel.h>        /* NXRunAlertPanel()        */
  10. #import <appkit/Slider.h>
  11. #import <appkit/Text.h>            /* GeneralPane is a text delegate */
  12. #import <appkit/TextField.h>
  13. #import <appkit/TextFieldCell.h>
  14. #import <appkit/View.h>
  15.  
  16. #import <objc/NXStringTable.h>
  17.  
  18. #import "GeneralPane.h"
  19. #import "Status.h"
  20.  
  21.  
  22. @interface GeneralPane (Private)
  23.  
  24. - _updateKeyIsThreeD:(BOOL)isThreeD;
  25. - _updateSize;
  26. - _updateTime;
  27.  
  28. @end
  29.  
  30.  
  31. @implementation GeneralPane
  32.  
  33.  
  34. - init
  35. {
  36.     [super init];
  37.  
  38.     [NXApp loadNibSection: "GeneralPane.nib"
  39.             owner: self
  40.         withNames: NO
  41.          fromZone: [self zone]];
  42.  
  43.     view = [window setContentView:[[View alloc] init]];
  44.     icon = "InspectorGeneral.tiff";
  45.  
  46.     return self;
  47. }
  48.  
  49.  
  50. /*  
  51.  *  The following methods should be overridden by subclasses.
  52.  */
  53. - selectControl:sender
  54. {
  55.     [titleField selectText:self];
  56.     return self;
  57. }
  58.  
  59.  
  60. - updateStatus:aStatus doc:aDoc
  61. {
  62.     id oldStatus = status;
  63.  
  64.     /*  
  65.      *  We only bother updating if status has changed since we last 
  66.      *  updated, or if we just became the current pane (didSwap) -- 
  67.      *  assuming that status and aDoc are non-nil, of course.
  68.      */
  69.  
  70.     if ([super updateStatus:aStatus doc:aDoc]
  71.     && ((status != oldStatus) || didSwap)) {
  72.  
  73.     BOOL isThreeD = [status isThreeD];
  74.     BOOL isPolar = [status isPolar];
  75.     Window *viewWindow;
  76.  
  77.     [(viewWindow = [view window]) disableDisplay];
  78.  
  79.         [polarButton setState:isPolar];
  80.         [polarButton setEnabled:!isThreeD];
  81.         [parametricButton setState:[status parametric]];
  82.         [borderButton setState:[status border]];
  83.         [self _updateKeyIsThreeD:isThreeD];
  84.         [self _updateTime];
  85.         [[samplesMatrix findCellWithTag:X_TAG] setIntValue:
  86.                         [status samples:X_TAG]];
  87.         [[samplesMatrix findCellWithTag:Y_TAG] setIntValue:
  88.                         [status samples:Y_TAG]];
  89.         [self _updateSize];
  90.         [titleField setStringValue:[status title]];
  91.  
  92.     [viewWindow reenableDisplay];
  93.  
  94.     [self perform:@selector(selectControl:)
  95.          with:self
  96.        afterDelay:1
  97.        cancelPrevious:YES];
  98.  
  99.     didSwap = NO;
  100.     return self;
  101.     }
  102.  
  103.     return nil;
  104. }
  105.  
  106.  
  107. - didSwapIn:sender
  108. {
  109.     didSwap = YES;
  110.     return self;
  111. }
  112.  
  113.  
  114.  
  115. - doSetPlotTitle:sender
  116. {
  117.     return [status setTitle: [sender stringValue]];
  118. }
  119.  
  120.  
  121. - doSetSizeProp:sender
  122. {
  123.     float aValue;
  124.  
  125.     if ([sender state])  {
  126.  
  127.         [status setSizeProp: 1];
  128.  
  129.         [status setSizeX:0 Y: aValue = [sizeXSlider floatValue]];
  130.         [sizeYSlider setFloatValue:aValue];
  131.         [sizeYField setFloatValue:aValue];
  132.  
  133.     } else
  134.         [status setSizeProp: 0];
  135.  
  136.     return self;
  137. }
  138.  
  139.  
  140. - doSetSize:sender
  141. {
  142.     float val[((X_TAG > Y_TAG)? X_TAG : Y_TAG) + 1];
  143.     int tag;
  144.  
  145.     val[tag = [sender tag]] = [sender floatValue];
  146.     if ([sizeButton state])
  147.     val[(X_TAG == tag)? Y_TAG : X_TAG] = val[tag];
  148.     else
  149.     val[(X_TAG == tag)? Y_TAG : X_TAG] = 0.0;
  150.  
  151.     [status setSizeX:val[X_TAG] Y:val[Y_TAG]];
  152.     [self _updateSize];
  153.  
  154.     return self;
  155. }
  156.  
  157.  
  158. - doSetBorder:sender
  159. {
  160.     return [status setBorder:[sender state]];
  161. }
  162.  
  163.  
  164. - doSetPolar:sender
  165. {
  166.     [status setPolar:[sender state]];
  167.     [self forceUpdateStatus:status doc:doc];
  168.     [view display];
  169.     return self;
  170. }
  171.  
  172.  
  173.  
  174.  
  175. /*  
  176.  *  This method informs the user the first time it is sent that 
  177.  *  parametric plots have special requirements.
  178.  */
  179. - doSetParametric:sender
  180. {
  181.     static BOOL didInform = NO;
  182.     int state = [sender state];
  183.  
  184.     if (!didInform && state) {
  185.         didInform = YES;
  186.         NXRunAlertPanel ([stringSet valueForStringKey: "parametric"],
  187.                          [stringSet valueForStringKey: "needEvenFunctions"],
  188.                          NULL, NULL, NULL);
  189.     }   
  190.     
  191.     return [status setParametric:state];
  192. }
  193.  
  194.  
  195. - doSetSamples:sender
  196. {
  197.     return [status setSamplesCoord:[sender selectedTag] to:[sender intValue]];
  198. }
  199.  
  200.  
  201. - doSetKey:sender
  202. {
  203.     [status setKey: [sender state]];
  204.     [self _updateKeyIsThreeD:[status isThreeD]];
  205.     if (![keyDefaultButton state])
  206.     [keyMatrix selectCellWithTag:X_TAG];
  207.  
  208.     return self;
  209. }
  210.  
  211.  
  212. - doSetKeyLocation:sender
  213. {
  214.     id cell = [sender selectedCell];
  215.     int tag = [cell tag];
  216.     double val = [cell doubleValue];
  217.  
  218.     if ([status isLogCoord:tag] && (val <= 0))  {
  219.         NXRunAlertPanel ([stringSet valueForStringKey: "key"],
  220.                          [stringSet valueForStringKey: "logKey"],
  221.                          NULL, NULL, NULL);
  222.         [self _updateKeyIsThreeD:[status isThreeD]];
  223.     } else
  224.         [status setKeyCoord:tag to:val];
  225.  
  226.     return self;
  227. }
  228.  
  229.  
  230. - doSetKeyDefault:sender
  231. {
  232.     int i;
  233.     BOOL ok = YES;
  234.     BOOL isDefaultOn = [sender state];
  235.  
  236.     for (i = 0 ; i < 3 ; i++)
  237.         if ([status isLogCoord:i] && ([[keyMatrix findCellWithTag:i]
  238.                                                 doubleValue] <= 0)) {
  239.             NXRunAlertPanel ([stringSet valueForStringKey: "key"],
  240.                              [stringSet valueForStringKey: "logKey"],
  241.                              NULL, NULL, NULL);
  242.             ok = NO;
  243.             break;
  244.         }
  245.  
  246.     if (ok)
  247.         [status setKeyDefault: isDefaultOn];
  248.  
  249.     [self _updateKeyIsThreeD:[status isThreeD]];
  250.  
  251.     if (ok && !isDefaultOn)
  252.     [keyMatrix selectCellWithTag:X_TAG];
  253.  
  254.     return self;
  255. }
  256.  
  257.  
  258. - doSetTime:sender
  259. {
  260.     [status setTime: [sender state]];
  261.     [self _updateTime];
  262.  
  263.     if (![timeDefaultButton state])
  264.     [timeMatrix selectCellWithTag:X_TAG];
  265.  
  266.     return self;
  267. }
  268.  
  269.  
  270. - doSetTimeLocation:sender
  271. {
  272.     id cell = [sender selectedCell];
  273.     int tag = [cell tag];
  274.     int val = [cell intValue];
  275.  
  276.     if ([status isLogCoord:tag] && (val <= 0))  {
  277.         NXRunAlertPanel ([stringSet valueForStringKey: "time"],
  278.                          [stringSet valueForStringKey: "logTime"],
  279.                          NULL, NULL, NULL);
  280.         [self _updateTime];
  281.     } else
  282.         [status setTimeCoord:tag to:val];
  283.  
  284.     return self;
  285. }
  286.  
  287.  
  288. - doSetTimeDefault:sender
  289. {
  290.     int i;
  291.     BOOL ok = YES;
  292.     BOOL isDefaultOn = [sender state];
  293.  
  294.     for (i = 0 ; i < 2 ; i++)
  295.         if ([status isLogCoord:i] && ([[timeMatrix findCellWithTag:i]
  296.                                                 doubleValue] <= 0)) {
  297.             NXRunAlertPanel ([stringSet valueForStringKey: "time"],
  298.                              [stringSet valueForStringKey: "logTime"],
  299.                              NULL, NULL, NULL);
  300.             ok = NO;
  301.             break;
  302.         }
  303.  
  304.     if (ok)
  305.         [status setTimeDefault: isDefaultOn];
  306.  
  307.     [self _updateTime];
  308.  
  309.     if (ok && !isDefaultOn)
  310.     [timeMatrix selectCellWithTag:X_TAG];
  311.  
  312.     return self;
  313. }
  314.  
  315.  
  316.  
  317. // Shuts up the compiler about unused RCSId
  318. - (const char *) rcsid
  319. {
  320.     return RCSId;
  321. }
  322.  
  323.  
  324. @end
  325.  
  326.  
  327. @implementation GeneralPane (Private)
  328.  
  329.  
  330. - _updateKeyIsThreeD:(BOOL)isThreeD
  331. {
  332.     int keyState = [status key];
  333.     int keyDefaultState = [status keyDefault];
  334.     int i;
  335.  
  336.     for (i = 0 ; i <= 2 ; i++)
  337.         [[keyMatrix findCellWithTag:i] setDoubleValue:[status keyCoord:i]];
  338.  
  339.     [keyButton setState: keyState];
  340.     [keyDefaultButton setState: keyDefaultState];
  341.     [keyDefaultButton setEnabled: keyState];
  342.  
  343.     if (keyState) {                     /* There is a key...            */
  344.  
  345.         [[keyMatrix findCellWithTag:X_TAG] setEnabled:!keyDefaultState];
  346.     [[keyLabelMatrix findCellWithTag:X_TAG] 
  347.                  setTextGray:keyDefaultState? NX_DKGRAY: NX_BLACK];
  348.  
  349.         [[keyMatrix findCellWithTag:Y_TAG] setEnabled:!keyDefaultState];
  350.     [[keyLabelMatrix findCellWithTag:Y_TAG] 
  351.                  setTextGray:keyDefaultState? NX_DKGRAY: NX_BLACK];
  352.  
  353.         [[keyMatrix findCellWithTag:Z_TAG] setEnabled:!keyDefaultState
  354.                                                       && isThreeD];
  355.     [[keyLabelMatrix findCellWithTag:Z_TAG] 
  356.           setTextGray:(keyDefaultState || !isThreeD)? NX_DKGRAY: NX_BLACK];
  357.  
  358.  
  359.     } else                            /* There is no key              */
  360.         for (i = 0 ; i < 3 ; i++)  {
  361.             [[keyMatrix findCellWithTag:i] setEnabled:NO];
  362.         [[keyLabelMatrix findCellWithTag:i] setTextGray:NX_DKGRAY];
  363.     }
  364.  
  365.     return self;
  366. }
  367.  
  368.  
  369.  
  370. - _updateSize
  371. {
  372.     float value;
  373.  
  374.     [sizeXSlider setFloatValue:value = [status sizeX]];
  375.     [sizeXField setFloatValue:value];
  376.     if ([status sizeProp])  {
  377.         [sizeYSlider setFloatValue:value];
  378.         [sizeYField setFloatValue:value];
  379.         [sizeButton setState:1];
  380.     } else {
  381.         [sizeYSlider setFloatValue:value = [status sizeY]];
  382.         [sizeYField setFloatValue:value];
  383.         [sizeButton setState:0];
  384.     }
  385.  
  386.     return self;
  387. }
  388.  
  389.  
  390.  
  391.  
  392. - _updateTime
  393. {
  394.     int timeState = [status time];
  395.     int timeDefaultState = [status timeDefault];
  396.  
  397.     [[timeMatrix findCellWithTag:X_TAG] setIntValue: [status timeCoord:X_TAG]];
  398.     [[timeMatrix findCellWithTag:Y_TAG] setIntValue: [status timeCoord:Y_TAG]];
  399.  
  400.     [timeButton setState: timeState];
  401.     [timeDefaultButton setState: timeDefaultState];
  402.     [timeDefaultButton setEnabled: timeState];
  403.  
  404.     if (timeState) {                    /* We do want to show time/date */
  405.  
  406.         [[timeMatrix findCellWithTag:X_TAG] setEnabled:!timeDefaultState];
  407.     [[timeLabelMatrix findCellWithTag:X_TAG]
  408.             setTextGray: timeDefaultState? NX_DKGRAY: NX_BLACK];
  409.         [[timeMatrix findCellWithTag:Y_TAG] setEnabled:!timeDefaultState];
  410.     [[timeLabelMatrix findCellWithTag:Y_TAG]
  411.             setTextGray: timeDefaultState? NX_DKGRAY: NX_BLACK];
  412.  
  413.     } else {                            /* We don't want to show time   */
  414.  
  415.         [[timeMatrix findCellWithTag:X_TAG] setEnabled:NO];
  416.     [[timeLabelMatrix findCellWithTag:X_TAG] setTextGray: NX_DKGRAY];
  417.         [[timeMatrix findCellWithTag:Y_TAG] setEnabled:NO];
  418.     [[timeLabelMatrix findCellWithTag:Y_TAG] setTextGray: NX_DKGRAY];
  419.  
  420.     }
  421.     return self;
  422. }
  423.  
  424.  
  425.  
  426.  
  427. @end
  428.